// #include <stdio.h>
// #include <stdlib.h>
// #include <stdbool.h>
// #include <ctype.h>
// #include <string.h>
// #include <math.h>
//
// #define MAX_SIZE 100
//
// typedef struct {
//     int data[MAX_SIZE];
//     int top;
// } Stack;
//
// typedef struct {
//     char data[MAX_SIZE];
//     int top;
// } CharStack;
//
// void initStack(Stack* s) {
//     s->top = -1;
// }
//
// void initCharStack(CharStack* s) {
//     s->top = -1;
// }
//
// bool isStackEmpty(Stack* s) {
//     return s->top == -1;
// }
//
// bool isCharStackEmpty(CharStack* s) {
//     return s->top == -1;
// }
//
// bool isStackFull(Stack* s) {
//     return s->top == MAX_SIZE - 1;
// }
//
// bool isCharStackFull(CharStack* s) {
//     return s->top == MAX_SIZE - 1;
// }
//
// bool push(Stack* s, int value) {
//     if (isStackFull(s)) {
//         printf("Stack is full!\n");
//         return false;
//     }
//     s->data[++s->top] = value;
//     return true;
// }
//
// bool pushChar(CharStack* s, char value) {
//     if (isCharStackFull(s)) {
//         printf("Char stack is full!\n");
//         return false;
//     }
//     s->data[++s->top] = value;
//     return true;
// }
//
// bool pop(Stack* s, int* value) {
//     if (isStackEmpty(s)) {
//         printf("Stack is empty!\n");
//         return false;
//     }
//     *value = s->data[s->top--];
//     return true;
// }
//
// bool popChar(CharStack* s, char* value) {
//     if (isCharStackEmpty(s)) {
//         printf("Char stack is empty!\n");
//         return false;
//     }
//     *value = s->data[s->top--];
//     return true;
// }
//
// int precedence(char op) {
//     if (op == '+' || op == '-') return 1;
//     if (op == '*' || op == '/') return 2;
//     return 0;
// }
//
// int applyOp(int a, int b, char op) {
//     switch (op) {
//         case '+': return a + b;
//         case '-': return a - b;
//         case '*': return a * b;
//         case '/':
//             if (b == 0) {
//                 printf("Error: Division by zero!\n");
//                 exit(1);
//             }
//             return a / b;
//     }
//     return 0;
// }
//
// int evaluate(const char* expression) {
//     Stack values;
//     initStack(&values);
//     CharStack ops;
//     initCharStack(&ops);
//
//     for (int i = 0; expression[i] != '\0'; i++) {
//         if (isspace(expression[i])) continue;
//
//         if (isdigit(expression[i])) {
//             int val = 0;
//             while (i < strlen(expression) && isdigit(expression[i])) {
//                 val = val * 10 + (expression[i] - '0');
//                 i++;
//             }
//             i--;
//             push(&values, val);
//         } else if (expression[i] == '(') {
//             pushChar(&ops, expression[i]);
//         } else if (expression[i] == ')') {
//             while (!isCharStackEmpty(&ops) && ops.data[ops.top] != '(') {
//                 int val2;
//                 pop(&values, &val2);
//                 int val1;
//                 pop(&values, &val1);
//                 char op;
//                 popChar(&ops, &op);
//                 push(&values, applyOp(val1, val2, op));
//             }
//             char dummy;
//             popChar(&ops, &dummy);
//         } else {
//             while (!isCharStackEmpty(&ops) && precedence(ops.data[ops.top]) >= precedence(expression[i])) {
//                 int val2;
//                 pop(&values, &val2);
//                 int val1;
//                 pop(&values, &val1);
//                 char op;
//                 popChar(&ops, &op);
//                 push(&values, applyOp(val1, val2, op));
//             }
//             pushChar(&ops, expression[i]);
//         }
//     }
//
//     while (!isCharStackEmpty(&ops)) {
//         int val2;
//         pop(&values, &val2);
//         int val1;
//         pop(&values, &val1);
//         char op;
//         popChar(&ops, &op);
//         push(&values, applyOp(val1, val2, op));
//     }
//
//     return values.data[values.top];
// }
//
// int main() {
//     char expression[] = "10 + 2 * 6";
//     printf("Evaluating expression: %s\n", expression);
//     printf("Result: %d\n", evaluate(expression));
//
//     char expression2[] = "(10 + 2) * 6";
//     printf("Evaluating expression: %s\n", expression2);
//     printf("Result: %d\n", evaluate(expression2));
//
//     return 0;
// }
